home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / cp2dekit / samples / binfcach.cpp < prev    next >
C/C++ Source or Header  |  1996-12-29  |  4KB  |  192 lines

  1. //***************************************************************************
  2. //
  3. // this file is (c) '94-'96 Niklas Beisert
  4. //
  5. // this file is part of the cubic player development kit.
  6. // you may only use/modify/spread this file under the terms stated
  7. // in the cubic player development kit accompanying documentation.
  8. //
  9. //***************************************************************************
  10.  
  11.  
  12. #include <string.h>
  13. #include "binfile.h"
  14.  
  15. binfilecache::binfilecache()
  16. {
  17. }
  18.  
  19. void binfilecache::invalidatebuf()
  20. {
  21.   if (dirty)
  22.   {
  23.     if (fileseekpos!=filebufpos)
  24.       f->seek(filebufpos);
  25.     bufread=f->write(buffer,bufread);
  26.     fileseekpos=filebufpos+bufread;
  27.     dirty=0;
  28.   }
  29.   filebufpos+=bufread;
  30.   bufread=0;
  31.   bufpos=0;
  32. }
  33.  
  34. int binfilecache::open(binfile &fil, int len)
  35. {
  36.   close();
  37.   if (!fil.getmode())
  38.     return 0;
  39.   f=&fil;
  40.   int fmode=f->getmode();
  41.   if ((fmode&canread)&&(fmode&canwrite)&&!(fmode&canseek))
  42.     return 0;
  43.  
  44.   buffer=new char[len];
  45.   if (!buffer)
  46.     return 0;
  47.   filelen=f->length();
  48.   buflen=len;
  49.   bufpos=0;
  50.   bufread=0;
  51.   filepos=0;
  52.   dirty=0;
  53.   fileseekpos=f->tell();
  54.   filebufpos=fileseekpos;
  55.   mode=fmode;
  56.   return 1;
  57. }
  58.  
  59. void binfilecache::close()
  60. {
  61.   if (mode)
  62.   {
  63.     invalidatebuf();
  64.     delete buffer;
  65.   }
  66.   binfile::close();
  67. }
  68.  
  69. long binfilecache::read(void *buf, long len)
  70. {
  71.   if (!(mode&canread))
  72.     return 0;
  73.   int len0=bufread-bufpos;
  74.   if (len<len0)
  75.     len0=len;
  76.   len-=len0;
  77.   memcpy(buf,buffer+bufpos,len0);
  78.   bufpos+=len0;
  79.   filepos=filebufpos+bufpos;
  80.   if (!len)
  81.     return len0;
  82.  
  83.   if (len<(buflen-bufread))
  84.   {
  85.     if (fileseekpos!=(filebufpos+bufread))
  86.       f->seek(filebufpos+bufread);
  87.     int l=f->read(buffer,buflen-bufread);
  88.     if (l<len)
  89.       len=l;
  90.     memcpy((char*)buf+len0,buffer+bufread,len);
  91.     bufpos+=len;
  92.     bufread+=l;
  93.   }
  94.   else
  95.   {
  96.     invalidatebuf();
  97.     if (len>=buflen)
  98.     {
  99.       if (fileseekpos!=filebufpos)
  100.         f->seek(filebufpos);
  101.       len=f->read((char*)buf+len0,len);
  102.       filebufpos+=len;
  103.     }
  104.     else
  105.     {
  106.       if (fileseekpos!=filebufpos)
  107.         f->seek(filebufpos);
  108.       bufread=f->read(buffer,buflen);
  109.       if (bufread<len)
  110.         len=bufread;
  111.       memcpy((char*)buf+len0,buffer,len);
  112.       bufpos=len;
  113.     }
  114.   }
  115.   fileseekpos=filebufpos+bufread;
  116.   filepos=filebufpos+bufpos;
  117.   return len0+len;
  118. }
  119.  
  120. long binfilecache::write(const void *buf, long len)
  121. {
  122.   if (!(mode&canwrite))
  123.     return 0;
  124.   if (!(mode&canchsize))
  125.     if (len>(filelen-filepos))
  126.       len=filelen-filepos;
  127.   int len0=buflen-bufpos;
  128.   if (len<len0)
  129.     len0=len;
  130.   if (len0)
  131.     dirty=1;
  132.   len-=len0;
  133.   memcpy(buffer+bufpos,buf,len0);
  134.   bufpos+=len0;
  135.   if (bufpos>bufread)
  136.     bufread=bufpos;
  137.   filepos=filebufpos+bufpos;
  138.   if (filepos>filelen)
  139.     filelen=filepos;
  140.   if (!len)
  141.     return len0;
  142.   invalidatebuf();
  143.  
  144.   if (len>=buflen)
  145.   {
  146.     if (fileseekpos!=filebufpos)
  147.       f->seek(filebufpos);
  148.     len=f->write((const char *)buf+len0,len);
  149.     filebufpos+=len;
  150.     fileseekpos=filebufpos;
  151.   }
  152.   else
  153.   {
  154.     memcpy(buffer,(const char *)buf+len0,len);
  155.     bufread=len;
  156.     bufpos=len;
  157.   }
  158.   filepos=filebufpos+bufpos;
  159.   if (filepos>filelen)
  160.     filelen=filepos;
  161.   return len0+len;
  162. }
  163.  
  164. long binfilecache::seek(long pos)
  165. {
  166.   if (!(mode&canseek))
  167.     return filepos;
  168.   if (pos<0)
  169.     pos=0;
  170.   if (pos>filelen)
  171.     pos=filelen;
  172.   if ((pos>=filebufpos)&&(pos<=(filebufpos+bufread)))
  173.     bufpos=pos-filebufpos;
  174.   else
  175.   {
  176.     invalidatebuf();
  177.     filebufpos=pos;
  178.   }
  179.   filepos=pos;
  180.   return filepos;
  181. }
  182.  
  183. long binfilecache::chsize(long pos)
  184. {
  185.   if (!(mode&canchsize))
  186.     return filelen;
  187.   invalidatebuf();
  188.   filelen=f->chsize(pos);
  189.   filepos=filebufpos=f->tell();
  190.   return filelen;
  191. }
  192.